package com.atguigu.chapter18.lowerbounds

//
//1）和Animal直系的，是Animal父类的还是父类处理，是Animal子类的按照Animal处理(),如果是子类
//2）和Animal无关的，一律按照Object处理！
object LowerBoundsDemo01 {
  def main(args: Array[String]): Unit = {
    println("ok!")
    //满足下界的约束
    biology(Seq(new Earth, new Earth)).foreach(_.sound())
    //满足下界的约束
    biology(Seq(new Animal, new Animal)).foreach(_.sound())

    //这里我们不能使用上界的思路去推导，这里是可以运行
    //1.可以将代码写入到cmd中执行查看具体类型
    println("===================")
    biology(Seq(new Bird, new Bird)).foreach(_.sound()) //

    //biology(Seq(new Moon))

  }

  //下界
  def biology[T >: Animal](things: Seq[T]): Seq[T] = things
}

class Earth { //Earth 类
  def sound() { //方法
    println("hello !")
  }
}

class Animal extends Earth {
  override def sound(): Unit = { //重写了Earth的方法sound()
    println("animal sounds ")
  }
}

class Bird extends Animal {
  override def sound(): Unit = { //将Animal的方法重写
    print("bird sounds ")
  }
}

class Moon {
  //  def sound()={ //将Animal的方法重写
  //    print("bird sounds")
  //  }
}
